h1b_df <- DATA

SECTION 1: BACKGROUND

SLIDE 7: MAP

DATA_certificate <- DATA %>%
  filter(case_status == "certified") %>%
  group_by(worksite_state_abb, year) %>%
  summarise(num = n())
DATA_new <-  DATA_certificate %>%
  ungroup(worksite_state_abb) %>%
  mutate(worksite_state_abb = str_to_upper(worksite_state_abb))
d1 <-
  ichoropleth(
    num ~ worksite_state_abb,
    data = DATA_new,
    animate = 'year',
    ncuts = 9,
    legend = FALSE,
    geographyConfig = list(popupTemplate = "#!function(geo, data) {return '<div class=\"hoverinfo\"><strong>' + data.worksite_state_abb + '<br>' + data.num + '</strong></div>';}!#")
  )
d1$save('rMaps.html', cdn = TRUE)
htmltools::includeHTML("rMaps.html")

SECTION 2: STEM

SLIDE 9: Stem and non-stem histogram

DATA %>%
  group_by(year, stem) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
  geom_bar(stat = "identity",
           position = position_stack(reverse = FALSE),
           alpha = 0.8) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  labs(y = "\n Number", x = "\n Year") +
  scale_y_continuous(
    labels = function(x) {
      paste0(x / 1000, 'K')
    }
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(legend.position = "top")

SLIDE 10: STEM and non-STEM boxplot: “Prevailing wage boxplot throughout years”

DATA %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
  ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
  geom_boxplot(
    aes(fill = as.factor(stem)),
    outlier.shape = NA,
    alpha = 0.9,
    color = "white"
  ) +
  theme_minimal() +
  labs(x = "\n Year", y = "Prevailing wage \n") +
  scale_y_continuous(
    labels = function(x) {
      paste0(x / 1000, "K")
    }
  ) +
  scale_color_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  coord_cartesian(ylim = c(40000, 100000))

SLIDE 11: Stem and non-stem prevailing wage distribution in 2018

DATA %>%
  filter(year == 2018) %>%
  filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>%
  ggplot(aes(
    x = prevailing_wage,
    color = as.factor(stem),
    fill = as.factor(stem)
  )) +
  geom_density(adjust = 2, alpha = 0.7) +
  theme_classic() +
  labs(x = "\n Prevailing wage ($)",
       y = expression(Density ~ (10 ^ {
         -3
       })),
       title = "") +
  scale_x_continuous(
    labels = function(x) {
      paste0(x / 1000, 'K')
    }
  ) +
  scale_y_continuous(
    labels = function(x) {
      paste0(x * 1000, "")
    }
  ) +
  scale_color_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("non-STEM", "STEM")
  ) +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme_minimal()

SLIDE 12 AND 13: bar plot: stem jobs

Slide 15

dt <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Engineer",
      "Data Analyst",
      "Data Scientist"
    )
  ) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  arrange(-n)

p1 <- dt %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2)+
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "Applications Data related jobs",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))
p1

slide 16

filtered_job <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Engineer",
      "Data Scientist",
      "Data Analyst"
    )
  )


filtered_job$data_job_title <-
  factor(
    filtered_job$data_job_title,
    levels = c(
      "Data Analyst",
      "Business Analyst",
      "Data Engineer",
      "Data Scientist"
    ),
    ordered = TRUE
  )


#filtered_job %>% group_by(data_job_title) %>% summarise(mean = mean(prevailing_wage))
filtered_job %>%
  ggplot(aes(y = prevailing_wage, x = data_job_title)) +
  geom_boxplot(
    fill = "#00B2E4",
    outlier.shape = NA,
    color = "white",
    width = 0.5
  ) +
  coord_cartesian(ylim = c(50000, 120000)) +
  theme_minimal() +
  labs(x = "\n Job title", y = "Prevailing wage (per year) \n", title = "Prevailing wages in data related jobs") +
  theme(
    plot.title = element_text(size = 1),
    text = element_text(size = 12),
    axis.title = element_text(size = 16),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Slide 17

top_com <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  ) %>%
  group_by(employer_name) %>%
  summarise(n = n()) %>%
  arrange(-n) %>%
  slice(1:20) %>%
  ungroup()

top_com <- top_com$employer_name

spa_data <- DATA %>%
  filter(employer_name %in% top_com) %>%
  filter(employer_name != "capgemini america inc") %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  ) %>%
  group_by(employer_name, year) %>%
  summarise(n = n())

con = c("infosys limited",
        "deloitte consulting llp",
        "amazon",
        "facebook",
        "ibm")
myColor <- c("#465881", "#FFB6C1", "#00909e", "#00B2E4", "#FC2967")

# c(amazon, "deloitte", "#facebook", "ibm", "info")

ggplot(spa_data, aes(x = year, y = n, group = employer_name)) +
  geom_line(alpha = 0.3,
            size = 0.2) +
  labs(x = "Year",
       y = "Number",
       col = "") +
  theme_classic() +
  geom_line(
    data = subset(spa_data, employer_name %in% con),
    aes(col = employer_name),
    size = 1.2
  ) +
  theme(
    plot.title = element_text(size = 14),
    text = element_text(size = 12),
    axis.title = element_text(face = "bold"),
    axis.text.x = element_text(size = 11)
  ) +
  scale_color_manual(
    values = myColor,
    breaks = c(
      "infosys limited",
      "deloitte consulting llp",
      "amazon",
      "facebook",
      "ibm"
    ),
    labels = c(
      "Infosys Limited",
      "Deloitte Consulting",
      "Amazon",
      "Facebook",
      "IBM"
    )
  )  +
  theme_minimal() +
  theme(legend.position = "right")

Slide 17

Data jobs in top companies

filtered_job_all <- DATA %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  ) %>%
  mutate(employer_name = ifelse(
    str_detect(employer_name, 'apple'),
    'Apple',
    ifelse(
      str_detect(employer_name, 'microsoft'),
      'Microsoft',
      ifelse(
        str_detect(employer_name, 'amazon'),
        'Amazon',
        ifelse(
          str_detect(employer_name, 'facebook'),
          'Facebook',
          ifelse(
            str_detect(employer_name, 'google'),
            'Google',
            ifelse(str_detect(employer_name, 'ibm'), 'IBM', employer_name)
          )
        )
      )
    )
  )) 
  

IBM

h1b_ibm <- h1b_df %>%
  filter(str_detect(employer_name, 'ibm'))
h1b_ibm <- h1b_ibm %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  arrange(-n)
con = c("Business Analyst",
        "Data Engineer",
        "Data Scientist",
        "Data Analyst")
ggplot(h1b_ibm, aes(x = year, y = n, group = data_job_title)) +
  geom_line(alpha = 0.3,
            size = 0.2) +
  labs(title = "",
       x = "Year",
       y = "Number",
       col = 'Job Title') +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_line(
    data = subset(h1b_ibm, data_job_title %in% con),
    aes(col = data_job_title),
    size = 1.1
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme(
    plot.title = element_text(size = 14, family = "Helvetica"),
    text = element_text(size = 12, family = "Helvetica"),
    #axis.title = element_text(face="bold"),
    axis.text.x = element_text(size = 11),
    legend.position = "none"
  ) +
  coord_cartesian(ylim = c(0, 1000))

filtered_job_all %>%
  filter(employer_name == 'IBM') %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

NA
NA

Infosys


filtered_job_all %>%
  filter(str_detect(employer_name, 'infosys')) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(legend.position = "top") +
  theme(plot.title = element_text(hjust = 0.5))

Accenture

filtered_job_all %>%
  filter(str_detect(employer_name, 'accenture')) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Microsoft

filtered_job_all %>%
  filter(employer_name == 'Microsoft') %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Amazon

filtered_job_all %>%
  filter(employer_name == 'Amazon') %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Deloitte

filtered_job_all %>%
  filter(str_detect(employer_name, "deloitte")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Facebook

filtered_job_all %>%
  filter(str_detect(employer_name, "Facebook")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Apple

filtered_job_all %>%
  filter(str_detect(employer_name, "Apple")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Google

filtered_job_all %>%
  filter(str_detect(employer_name, "Google")) %>%
  group_by(data_job_title, year) %>%
  summarise(n = n()) %>%
  ggplot(aes(x = year, y = n)) +
  #geom_point(aes(color = data_job_title), size = 2) +
  geom_line(aes(color = data_job_title), size = 1.2) +
  labs(
    y = "",
    x = "Year",
    title = "",
    face = "bold",
    size = 14
  ) +
  scale_color_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                     name = "") +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text = element_text(size = 15),
    axis.title.x = element_text(size = 15)
  ) +
  theme(plot.title = element_text(hjust = 0.5))

Data job per state in 2018

DATA_certificate_data <- DATA %>%
  filter(case_status == "certified") %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Engineer",
      "Data Analyst",
      "Data Scientist"
    )
  ) %>%
  group_by(worksite_state_abb, year) %>%
  summarise(num = n())
DATA_new_data <-  DATA_certificate_data %>%
  ungroup(worksite_state_abb) %>%
  mutate(worksite_state_abb = str_to_upper(worksite_state_abb))
d1 <-
  ichoropleth(
    num ~ worksite_state_abb,
    data = DATA_new_data,
    animate = 'year',
    ncuts = 8,
    legend = FALSE,
    geographyConfig = list(popupTemplate = "#!function(geo, data) {return '<div class=\"hoverinfo\"><strong>' + data.worksite_state_abb + '<br>' + data.num + '</strong></div>';}!#")
  )
d1$save('rMaps_data.html', cdn = TRUE)
htmltools::includeHTML("rMaps.html")

Alluvia

filtered_job <- DATA %>%
  filter(year == 2018) %>%
  filter(
    data_job_title %in% c(
      "Business Analyst",
      "Data Analyst",
      "Data Engineer",
      "Data Scientist"
    )
  )


top_10_state <- filtered_job %>%
  group_by(worksite_state_abb) %>%
  summarise(count = n()) %>%
  arrange(desc(count)) %>%
  slice(1:10)

flows <- filtered_job %>%
  filter(worksite_state_abb %in% top_10_state$worksite_state_abb) %>%
  group_by(data_job_title,
           worksite_state_abb) %>%
  summarise(count = n())


ggplot(flows,
       aes(y = count, axis1 = data_job_title, axis2 = worksite_state_abb)) +
  geom_alluvium(aes(fill = data_job_title)) +
  geom_stratum(
    width = 1 / 8,
    fill = "#0F2A48",
    color = "grey",
    alpha = 0.9
  ) +
  geom_label(stat = "stratum", label.strata = TRUE) +
  labs(x = "", y = "") +
  theme_minimal() +
  theme(legend.position = "top") +
  scale_fill_manual(values = c("#FC2967", "#465881", "#00909e", "#00B2E4"),
                    name = NULL) +
  scale_x_discrete(limits = c("Job title", "State"),
                   expand = c(.05, .05)) +
  theme(axis.text.x = element_text(size = 12, face = "bold")) +
  theme(line = element_blank())

bar plot:stem program in different job titles

DATA %>% 
  mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>% 
  mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>% 
  filter(year == 2018) %>% 
  filter(stem == 1) %>% 
  group_by(job_title) %>% 
  summarise(n = n()) %>%
  arrange(-n) %>% 
  slice(1:20) %>% 
  ggbarplot("job_title", "n", fill = "#00B2E4", color = "white", alpha = 0.8, sort.val = "asc", orientation = "horiz") %>% 
  labs(title = "stem program")
[[1]]

$title
[1] "stem program"

attr(,"class")
[1] "labels"

MAP - data job with the highest number in each city

ggplot(points) +
  geom_sf(
    data = state_maps,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon, 100),
    y = jitter(lat, 100),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    legend.box = "horizontal",
    legend.position = c(0, -0.1),
    legend.justification = c(0, 0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")
ggplot(points_ca) +
  geom_sf(
    data = state_maps_ca,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_tx) +
  geom_sf(
    data = state_maps_tx,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_northeast) +
  geom_sf(
    data = state_maps_northeast,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_midwest) +
  geom_sf(
    data = state_maps_midwest,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon, 100),
    y = jitter(lat, 100),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_tn) +
  geom_sf(
    data = state_maps_tn,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_fl) +
  geom_sf(
    data = state_maps_fl,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

ggplot(points_wa) +
  geom_sf(
    data = state_maps_wa,
    color = "white",
    fill = "lightgrey",
    alpha = 0.5
  ) +
  geom_point(aes(
    x = jitter(lon),
    y = jitter(lat),
    color = max_job,
    size = max
  ), alpha = 0.5) +
  scale_color_manual(
    values = c(
      "Business Analyst" = "#00B2E4",
      "Data Analyst" = "#0F2A48",
      "Data Engineer" = "#008B8B",
      "Data Scientist" = "#FC2967"
    ),
    name = "Job Title"
  ) +
  theme(
    panel.background = element_blank(),
    legend.background = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank(),
    #legend.position = c(0,0), legend.justification = c(0,0)
  ) +
  labs(x = "",
       y = "",
       title = "",
       size = "Number")

DATA %>%
  filter(worksite_state_abb == "TN") %>%
  group_by(year, data_relation) %>%
  summarise(n = n()) %>%
  
  ggplot(aes(
    x = year,
    y = n,
    fill = as.factor(data_relation)
  )) +
  geom_bar(stat = "identity",
           position = "dodge",
           alpha = 0.8) +
  scale_fill_manual(
    values = c("#00B2E4", "#0F2A48"),
    name = "",
    labels = c("Data jobs", "Others")
  ) +
  labs(y = "\n Number", x = "\n Year") +
  #scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(legend.position = "top")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCiMgU0VDVElPTiAxOiBCQUNLR1JPVU5ECiMgU0xJREUgNzogTUFQCmBgYHtyfQpEQVRBX2NlcnRpZmljYXRlIDwtIERBVEEgJT4lCiAgZmlsdGVyKGNhc2Vfc3RhdHVzID09ICJjZXJ0aWZpZWQiKSAlPiUKICBncm91cF9ieSh3b3Jrc2l0ZV9zdGF0ZV9hYmIsIHllYXIpICU+JQogIHN1bW1hcmlzZShudW0gPSBuKCkpCmBgYAoKYGBge3J9CkRBVEFfbmV3IDwtICBEQVRBX2NlcnRpZmljYXRlICU+JQogIHVuZ3JvdXAod29ya3NpdGVfc3RhdGVfYWJiKSAlPiUKICBtdXRhdGUod29ya3NpdGVfc3RhdGVfYWJiID0gc3RyX3RvX3VwcGVyKHdvcmtzaXRlX3N0YXRlX2FiYikpCmBgYAoKYGBge3J9CmQxIDwtCiAgaWNob3JvcGxldGgoCiAgICBudW0gfiB3b3Jrc2l0ZV9zdGF0ZV9hYmIsCiAgICBkYXRhID0gREFUQV9uZXcsCiAgICBhbmltYXRlID0gJ3llYXInLAogICAgbmN1dHMgPSA5LAogICAgbGVnZW5kID0gRkFMU0UsCiAgICBnZW9ncmFwaHlDb25maWcgPSBsaXN0KHBvcHVwVGVtcGxhdGUgPSAiIyFmdW5jdGlvbihnZW8sIGRhdGEpIHtyZXR1cm4gJzxkaXYgY2xhc3M9XCJob3ZlcmluZm9cIj48c3Ryb25nPicgKyBkYXRhLndvcmtzaXRlX3N0YXRlX2FiYiArICc8YnI+JyArIGRhdGEubnVtICsgJzwvc3Ryb25nPjwvZGl2Pic7fSEjIikKICApCmBgYAoKYGBge3J9CmQxJHNhdmUoJ3JNYXBzLmh0bWwnLCBjZG4gPSBUUlVFKQpgYGAKCmBgYHtyfQpodG1sdG9vbHM6OmluY2x1ZGVIVE1MKCJyTWFwcy5odG1sIikKYGBgCgojIFNFQ1RJT04gMjogU1RFTQojIFNMSURFIDk6IFN0ZW0gYW5kIG5vbi1zdGVtIGhpc3RvZ3JhbQpgYGB7ciBmaWcuaGVpZ2h0PTIuNiwgZmlnLndpZHRoPTIuM30KREFUQSAlPiUKICBncm91cF9ieSh5ZWFyLCBzdGVtKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsCiAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gRkFMU0UpLAogICAgICAgICAgIGFscGhhID0gMC44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwKICAgIG5hbWUgPSAiIiwKICAgIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKQogICkgKwogIGxhYnMoeSA9ICJcbiBOdW1iZXIiLCB4ID0gIlxuIFllYXIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gZnVuY3Rpb24oeCkgewogICAgICBwYXN0ZTAoeCAvIDEwMDAsICdLJykKICAgIH0KICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCiMgU0xJREUgMTA6IFNURU0gYW5kIG5vbi1TVEVNIGJveHBsb3Q6ICJQcmV2YWlsaW5nIHdhZ2UgYm94cGxvdCB0aHJvdWdob3V0IHllYXJzIgpgYGB7cn0KREFUQSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNjAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhcy5mYWN0b3IoeWVhciksIHkgPSBwcmV2YWlsaW5nX3dhZ2UpKSArCiAgZ2VvbV9ib3hwbG90KAogICAgYWVzKGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpLAogICAgb3V0bGllci5zaGFwZSA9IE5BLAogICAgYWxwaGEgPSAwLjksCiAgICBjb2xvciA9ICJ3aGl0ZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoeCA9ICJcbiBZZWFyIiwgeSA9ICJQcmV2YWlsaW5nIHdhZ2UgXG4iKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gZnVuY3Rpb24oeCkgewogICAgICBwYXN0ZTAoeCAvIDEwMDAsICJLIikKICAgIH0KICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwKICAgIG5hbWUgPSAiIiwKICAgIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKQogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksCiAgICBuYW1lID0gIiIsCiAgICBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikKICApICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNDAwMDAsIDEwMDAwMCkpCmBgYAoKCiMgU0xJREUgMTE6IFN0ZW0gYW5kIG5vbi1zdGVtIHByZXZhaWxpbmcgd2FnZSBkaXN0cmlidXRpb24gaW4gMjAxOApgYGB7cn0KREFUQSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNDAwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKAogICAgeCA9IHByZXZhaWxpbmdfd2FnZSwKICAgIGNvbG9yID0gYXMuZmFjdG9yKHN0ZW0pLAogICAgZmlsbCA9IGFzLmZhY3RvcihzdGVtKQogICkpICsKICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMiwgYWxwaGEgPSAwLjcpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICJcbiBQcmV2YWlsaW5nIHdhZ2UgKCQpIiwKICAgICAgIHkgPSBleHByZXNzaW9uKERlbnNpdHkgfiAoMTAgXiB7CiAgICAgICAgIC0zCiAgICAgICB9KSksCiAgICAgICB0aXRsZSA9ICIiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGFiZWxzID0gZnVuY3Rpb24oeCkgewogICAgICBwYXN0ZTAoeCAvIDEwMDAsICdLJykKICAgIH0KICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBmdW5jdGlvbih4KSB7CiAgICAgIHBhc3RlMCh4ICogMTAwMCwgIiIpCiAgICB9CiAgKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygiIzAwQjJFNCIsICIjMEYyQTQ4IiksCiAgICBuYW1lID0gIiIsCiAgICBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikKICApICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLAogICAgbmFtZSA9ICIiLAogICAgbGFiZWxzID0gYygibm9uLVNURU0iLCAiU1RFTSIpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKIyBTTElERSAxMiBBTkQgMTM6IGJhciBwbG90OiBzdGVtIGpvYnMKYGBge3J9CmR0IDwtIERBVEEgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYnVzaW5lc3MiKSAmCiAgICAgICgKICAgICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKSB8CiAgICAgICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImludGVsbGlnZW5jZSIpCiAgICAgICkgLAogICAgImJ1c2luZXNzIGFuYWx5c3QiLAogICAgam9iX3RpdGxlCiAgKSkgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpICYKICAgICAgKAogICAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZW5naW5lZXIiKSB8CiAgICAgICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIndhcmVob3VzZSIpCiAgICAgICksCiAgICAiZGF0YSBlbmdpbmVlciIsCiAgICBqb2JfdGl0bGUKICApKSAlPiUKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikgJgogICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLAogICAgImRhdGEgc2NpZW50aXN0IiwKICAgIGpvYl90aXRsZQogICkpICU+JQogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSAmCiAgICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxhbmFseXRpY3MiKSwKICAgICJkYXRhIGFuYWx5c3QiLAogICAgam9iX3RpdGxlCiAgKSkgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibWFjaGluZXxkZWVwIikgJgogICAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksCiAgICAiZGVlcCBsZWFybmluZyAmIG1hY2hpbmUgbGVhcm5pbmciLAogICAgam9iX3RpdGxlCiAgKSkgJT4lCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZSgKICAgIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpICYKICAgICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGVuZ2luZWVyfGRhdGEiKSwKICAgICJkYXRhIHByb2R1Y3QgYW5hbHlzdCIsCiAgICBqb2JfdGl0bGUKICApKSAlPiUKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJzZW5pb3Igc3lzdGVtcyBhbmFseXN0IGpjNjAiKSwKICAgICJzZW5pb3Igc3lzdGVtcyBhbmFseXN0IiwKICAgIGpvYl90aXRsZQogICkpICU+JQogIGZpbHRlcihzdGVtID09IDEpCgpkdCAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUKICBncm91cF9ieShqb2JfdGl0bGUpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUKICBzbGljZSgxOjIwKSAlPiUKICBtdXRhdGUoY2F0ID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChqb2JfdGl0bGUsICJzeXN0ZW1zfHByb2dyYW1tZXIiKSB+ICJub24tZGF0YSIsCiAgICBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8ZGF0YSIpIH4gImRhdGEiLAogICAgVFJVRSB+ICJub24tZGF0YSIKICApKSAlPiUKICBhcnJhbmdlKG4pICU+JSAKICBnZ2JhcnBsb3QoCiAgICAiam9iX3RpdGxlIiwKICAgICJuIiwKICAgIGZpbGwgPSAiY2F0IiwKICAgIHBhbGV0dGUgPSBjKCIjRkMyOTY3IiwgIiMwMEIyRTQiKSwKICAgIGFscGhhID0gMC44LAogICAgb3JpZW50YXRpb24gPSAiaG9yaXoiLAogICAgY29sb3IgPSAid2hpdGUiCiAgKSArCiAgbGFicyh5ID0gIk51bWJlciBvZiBBcGxpY2F0aW9ucyIsIHggPSAiSm9iIFRpdGxlcyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKCgojIG9yaWdpbmFsCmR0ICU+JQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JQogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pICU+JQogIHNsaWNlKDE6MjApICU+JQogIGFycmFuZ2UobikgJT4lCiAgZ2diYXJwbG90KAogICAgImpvYl90aXRsZSIsCiAgICAibiIsCiAgICBmaWxsID0gIiMwMEIyRTQiLAogICAgYWxwaGEgPSAwLjgsCiAgICBvcmllbnRhdGlvbiA9ICJob3JpeiIsCiAgICBjb2xvciA9ICJ3aGl0ZSIKICApICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMgU2xpZGUgMTUKYGBge3IsZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NH0KZHQgPC0gREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKQoKcDEgPC0gZHQgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSArCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiQXBwbGljYXRpb25zIERhdGEgcmVsYXRlZCBqb2JzIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCnAxCmBgYAoKIyBzbGlkZSAxNgoKYGBge3J9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIsCiAgICAgICJEYXRhIEFuYWx5c3QiCiAgICApCiAgKQoKCmZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSA8LQogIGZhY3RvcigKICAgIGZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSwKICAgIGxldmVscyA9IGMoCiAgICAgICJEYXRhIEFuYWx5c3QiLAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKSwKICAgIG9yZGVyZWQgPSBUUlVFCiAgKQoKCiNmaWx0ZXJlZF9qb2IgJT4lIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHByZXZhaWxpbmdfd2FnZSkpCmZpbHRlcmVkX2pvYiAlPiUKICBnZ3Bsb3QoYWVzKHkgPSBwcmV2YWlsaW5nX3dhZ2UsIHggPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2JveHBsb3QoCiAgICBmaWxsID0gIiMwMEIyRTQiLAogICAgb3V0bGllci5zaGFwZSA9IE5BLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgd2lkdGggPSAwLjUKICApICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNTAwMDAsIDEyMDAwMCkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoeCA9ICJcbiBKb2IgdGl0bGUiLCB5ID0gIlByZXZhaWxpbmcgd2FnZSAocGVyIHllYXIpIFxuIiwgdGl0bGUgPSAiUHJldmFpbGluZyB3YWdlcyBpbiBkYXRhIHJlbGF0ZWQgam9icyIpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEpLAogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKIyBTbGlkZSAxNwpgYGB7cn0KdG9wX2NvbSA8LSBEQVRBICU+JQogIGZpbHRlcigKICAgIGRhdGFfam9iX3RpdGxlICVpbiUgYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiCiAgICApCiAgKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lCiAgc2xpY2UoMToyMCkgJT4lCiAgdW5ncm91cCgpCgp0b3BfY29tIDwtIHRvcF9jb20kZW1wbG95ZXJfbmFtZQoKc3BhX2RhdGEgPC0gREFUQSAlPiUKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSAlaW4lIHRvcF9jb20pICU+JQogIGZpbHRlcihlbXBsb3llcl9uYW1lICE9ICJjYXBnZW1pbmkgYW1lcmljYSBpbmMiKSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpCgpjb24gPSBjKCJpbmZvc3lzIGxpbWl0ZWQiLAogICAgICAgICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsCiAgICAgICAgImFtYXpvbiIsCiAgICAgICAgImZhY2Vib29rIiwKICAgICAgICAiaWJtIikKbXlDb2xvciA8LSBjKCIjNDY1ODgxIiwgIiNGRkI2QzEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiwgIiNGQzI5NjciKQoKIyBjKGFtYXpvbiwgImRlbG9pdHRlIiwgIiNmYWNlYm9vayIsICJpYm0iLCAiaW5mbyIpCgpnZ3Bsb3Qoc3BhX2RhdGEsIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZW1wbG95ZXJfbmFtZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAiIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IHN1YnNldChzcGFfZGF0YSwgZW1wbG95ZXJfbmFtZSAlaW4lIGNvbiksCiAgICBhZXMoY29sID0gZW1wbG95ZXJfbmFtZSksCiAgICBzaXplID0gMS4yCiAgKSArCiAgdGhlbWUoCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKQogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IG15Q29sb3IsCiAgICBicmVha3MgPSBjKAogICAgICAiaW5mb3N5cyBsaW1pdGVkIiwKICAgICAgImRlbG9pdHRlIGNvbnN1bHRpbmcgbGxwIiwKICAgICAgImFtYXpvbiIsCiAgICAgICJmYWNlYm9vayIsCiAgICAgICJpYm0iCiAgICApLAogICAgbGFiZWxzID0gYygKICAgICAgIkluZm9zeXMgTGltaXRlZCIsCiAgICAgICJEZWxvaXR0ZSBDb25zdWx0aW5nIiwKICAgICAgIkFtYXpvbiIsCiAgICAgICJGYWNlYm9vayIsCiAgICAgICJJQk0iCiAgICApCiAgKSAgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmBgYAoKCiMgU2xpZGUgMTcKIyBUb3AgVGVjaCBDb21wYW5pZXMgYW5kIFRoZWlyIFRyZW5kcwpgYGB7cn0Kc29jX3RvcF90ZWNoIDwtIGMoIkFwcGxlIiwKICAgICAgICAgICAgICAgICAgIk1pY3Jvc29mdCIsCiAgICAgICAgICAgICAgICAgICJBbWF6b24iLAogICAgICAgICAgICAgICAgICAiRmFjZWJvb2siLAogICAgICAgICAgICAgICAgICAiR29vZ2xlIiwKICAgICAgICAgICAgICAgICAgIklCTSIpCgoKREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgRW5naW5lZXIiLAogICAgICAiRGF0YSBBbmFseXN0IiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgbXV0YXRlKGVtcGxveWVyX25hbWUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhcHBsZScpLAogICAgJ0FwcGxlJywKICAgIGlmZWxzZSgKICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnbWljcm9zb2Z0JyksCiAgICAgICdNaWNyb3NvZnQnLAogICAgICBpZmVsc2UoCiAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnYW1hem9uJyksCiAgICAgICAgJ0FtYXpvbicsCiAgICAgICAgaWZlbHNlKAogICAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnZmFjZWJvb2snKSwKICAgICAgICAgICdGYWNlYm9vaycsCiAgICAgICAgICBpZmVsc2UoCiAgICAgICAgICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2dvb2dsZScpLAogICAgICAgICAgICAnR29vZ2xlJywKICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2libScpLCAnSUJNJywgJ25vJykKICAgICAgICAgICkKICAgICAgICApCiAgICAgICkKICAgICkKICApKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUKICBzdW1tYXJpc2UodG90ID0gbigpKSAlPiUKICBmaWx0ZXIoIWVtcGxveWVyX25hbWUgJWluJSBjKCJubyIsIE5BKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdncGxvdCgpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJSZEJ1IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSB0b3QsIGNvbG9yID0gZW1wbG95ZXJfbmFtZSksIHNpemUgPSAxLjUpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwcGxpY2F0aW9ucyIsIHggPSAiWWVhciIsIGNvbG9yID0gIkVtcGxveWVyIikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKIyBEYXRhIGpvYnMgaW4gdG9wIGNvbXBhbmllcyAKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgPC0gREFUQSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkgJT4lCiAgbXV0YXRlKGVtcGxveWVyX25hbWUgPSBpZmVsc2UoCiAgICBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhcHBsZScpLAogICAgJ0FwcGxlJywKICAgIGlmZWxzZSgKICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnbWljcm9zb2Z0JyksCiAgICAgICdNaWNyb3NvZnQnLAogICAgICBpZmVsc2UoCiAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnYW1hem9uJyksCiAgICAgICAgJ0FtYXpvbicsCiAgICAgICAgaWZlbHNlKAogICAgICAgICAgc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnZmFjZWJvb2snKSwKICAgICAgICAgICdGYWNlYm9vaycsCiAgICAgICAgICBpZmVsc2UoCiAgICAgICAgICAgIHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2dvb2dsZScpLAogICAgICAgICAgICAnR29vZ2xlJywKICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2libScpLCAnSUJNJywgZW1wbG95ZXJfbmFtZSkKICAgICAgICAgICkKICAgICAgICApCiAgICAgICkKICAgICkKICApKSAKICAKYGBgCgoKIyMgSUJNIAoKYGBge3J9CmgxYl9pYm0gPC0gaDFiX2RmICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSkKCmBgYAoKYGBge3J9CmgxYl9pYm0gPC0gaDFiX2libSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3IgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9Mi41fQpjb24gPSBjKCJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgICAiRGF0YSBFbmdpbmVlciIsCiAgICAgICAgIkRhdGEgU2NpZW50aXN0IiwKICAgICAgICAiRGF0YSBBbmFseXN0IikKZ2dwbG90KGgxYl9pYm0sIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICIiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBzdWJzZXQoaDFiX2libSwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLAogICAgYWVzKGNvbCA9IGRhdGFfam9iX3RpdGxlKSwKICAgIHNpemUgPSAxLjEKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZSgKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgI2F4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxMDAwKSkKYGBgCgoKCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihlbXBsb3llcl9uYW1lID09ICdJQk0nKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCgpgYGAKCiMgSW5mb3N5cwpgYGB7cn0KCmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgJ2luZm9zeXMnKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCiMgQWNjZW50dXJlCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdhY2NlbnR1cmUnKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKCiMgTWljcm9zb2Z0CmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JQogIGZpbHRlcihlbXBsb3llcl9uYW1lID09ICdNaWNyb3NvZnQnKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgojIEFtYXpvbgpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnQW1hem9uJykgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKIyBEZWxvaXR0ZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiZGVsb2l0dGUiKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKIyBGYWNlYm9vawpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiRmFjZWJvb2siKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKIyBBcHBsZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiQXBwbGUiKSkgJT4lCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpICsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDEuMikgKwogIGxhYnMoCiAgICB5ID0gIiIsCiAgICB4ID0gIlllYXIiLAogICAgdGl0bGUgPSAiIiwKICAgIGZhY2UgPSAiYm9sZCIsCiAgICBzaXplID0gMTQKICApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0ZDMjk2NyIsICIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKIyBHb29nbGUKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgIkdvb2dsZSIpKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkgKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMS4yKSArCiAgbGFicygKICAgIHkgPSAiIiwKICAgIHggPSAiWWVhciIsCiAgICB0aXRsZSA9ICIiLAogICAgZmFjZSA9ICJib2xkIiwKICAgIHNpemUgPSAxNAogICkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKCgoKIyBEYXRhIGpvYiBwZXIgc3RhdGUgaW4gMjAxOAoKYGBge3J9CkRBVEFfY2VydGlmaWNhdGVfZGF0YSA8LSBEQVRBICU+JQogIGZpbHRlcihjYXNlX3N0YXR1cyA9PSAiY2VydGlmaWVkIikgJT4lCiAgZmlsdGVyKAogICAgZGF0YV9qb2JfdGl0bGUgJWluJSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgQW5hbHlzdCIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIKICAgICkKICApICU+JQogIGdyb3VwX2J5KHdvcmtzaXRlX3N0YXRlX2FiYiwgeWVhcikgJT4lCiAgc3VtbWFyaXNlKG51bSA9IG4oKSkKYGBgCgpgYGB7cn0KREFUQV9uZXdfZGF0YSA8LSAgREFUQV9jZXJ0aWZpY2F0ZV9kYXRhICU+JQogIHVuZ3JvdXAod29ya3NpdGVfc3RhdGVfYWJiKSAlPiUKICBtdXRhdGUod29ya3NpdGVfc3RhdGVfYWJiID0gc3RyX3RvX3VwcGVyKHdvcmtzaXRlX3N0YXRlX2FiYikpCmBgYAoKYGBge3J9CmQxIDwtCiAgaWNob3JvcGxldGgoCiAgICBudW0gfiB3b3Jrc2l0ZV9zdGF0ZV9hYmIsCiAgICBkYXRhID0gREFUQV9uZXdfZGF0YSwKICAgIGFuaW1hdGUgPSAneWVhcicsCiAgICBuY3V0cyA9IDgsCiAgICBsZWdlbmQgPSBGQUxTRSwKICAgIGdlb2dyYXBoeUNvbmZpZyA9IGxpc3QocG9wdXBUZW1wbGF0ZSA9ICIjIWZ1bmN0aW9uKGdlbywgZGF0YSkge3JldHVybiAnPGRpdiBjbGFzcz1cImhvdmVyaW5mb1wiPjxzdHJvbmc+JyArIGRhdGEud29ya3NpdGVfc3RhdGVfYWJiICsgJzxicj4nICsgZGF0YS5udW0gKyAnPC9zdHJvbmc+PC9kaXY+Jzt9ISMiKQogICkKYGBgCgpgYGB7cn0KZDEkc2F2ZSgnck1hcHNfZGF0YS5odG1sJywgY2RuID0gVFJVRSkKYGBgCgpgYGB7cn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgick1hcHMuaHRtbCIpCmBgYAoKCiMjIEFsbHV2aWEKYGBge3IsZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9Mi43fQpmaWx0ZXJlZF9qb2IgPC0gREFUQSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUKICBmaWx0ZXIoCiAgICBkYXRhX2pvYl90aXRsZSAlaW4lIGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IgogICAgKQogICkKCgp0b3BfMTBfc3RhdGUgPC0gZmlsdGVyZWRfam9iICU+JQogIGdyb3VwX2J5KHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUKICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUKICBzbGljZSgxOjEwKQoKZmxvd3MgPC0gZmlsdGVyZWRfam9iICU+JQogIGZpbHRlcih3b3Jrc2l0ZV9zdGF0ZV9hYmIgJWluJSB0b3BfMTBfc3RhdGUkd29ya3NpdGVfc3RhdGVfYWJiKSAlPiUKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwKICAgICAgICAgICB3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKCgpnZ3Bsb3QoZmxvd3MsCiAgICAgICBhZXMoeSA9IGNvdW50LCBheGlzMSA9IGRhdGFfam9iX3RpdGxlLCBheGlzMiA9IHdvcmtzaXRlX3N0YXRlX2FiYikpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9zdHJhdHVtKAogICAgd2lkdGggPSAxIC8gOCwKICAgIGZpbGwgPSAiIzBGMkE0OCIsCiAgICBjb2xvciA9ICJncmV5IiwKICAgIGFscGhhID0gMC45CiAgKSArCiAgZ2VvbV9sYWJlbChzdGF0ID0gInN0cmF0dW0iLCBsYWJlbC5zdHJhdGEgPSBUUlVFKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkMyOTY3IiwgIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkpvYiB0aXRsZSIsICJTdGF0ZSIpLAogICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYyguMDUsIC4wNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpKSArCiAgdGhlbWUobGluZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKIyMgYmFyIHBsb3Q6c3RlbSBwcm9ncmFtIGluIGRpZmZlcmVudCBqb2IgdGl0bGVzCmBgYHtyfQpEQVRBICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYnVzaW5lc3MiKSYgKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdCIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiaW50ZWxsaWdlbmNlIikpICwgImJ1c2luZXNzIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZW5naW5lZXIiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIndhcmVob3VzZSIpKSwgImRhdGEgZW5naW5lZXIiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJzY2llbnRpc3QiKSwgImRhdGEgc2NpZW50aXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxhbmFseXRpY3MiKSwgImRhdGEgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibWFjaGluZXxkZWVwIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAibGVhcm5pbmciKSwgImRlZXAgbGVhcm5pbmcgJiBtYWNoaW5lIGxlYXJuaW5nIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJwcm9kdWN0IikgJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8ZW5naW5lZXJ8ZGF0YSIpLCAiZGF0YSBwcm9kdWN0IGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lIAogIGZpbHRlcihzdGVtID09IDEpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICBnZ2JhcnBsb3QoImpvYl90aXRsZSIsICJuIiwgZmlsbCA9ICIjMDBCMkU0IiwgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuOCwgc29ydC52YWwgPSAiYXNjIiwgb3JpZW50YXRpb24gPSAiaG9yaXoiKSAlPiUgCiAgbGFicyh0aXRsZSA9ICJzdGVtIHByb2dyYW0iKQpgYGAKCiMgTUFQIC0gZGF0YSBqb2Igd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgaW4gZWFjaCBjaXR5IApgYGB7cn0KZ2dwbG90KHBvaW50cykgKwogIGdlb21fc2YoCiAgICBkYXRhID0gc3RhdGVfbWFwcywKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiwgMTAwKSwKICAgIHkgPSBqaXR0ZXIobGF0LCAxMDApLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJveCA9ICJob3Jpem9udGFsIiwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMCwgLTAuMSksCiAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfY2EpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHNfY2EsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24pLAogICAgeSA9IGppdHRlcihsYXQpLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfdHgpICsKICBnZW9tX3NmKAogICAgZGF0YSA9IHN0YXRlX21hcHNfdHgsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24pLAogICAgeSA9IGppdHRlcihsYXQpLAogICAgY29sb3IgPSBtYXhfam9iLAogICAgc2l6ZSA9IG1heAogICksIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygKICAgICAgIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLAogICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciCiAgICApLAogICAgbmFtZSA9ICJKb2IgVGl0bGUiCiAgKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICApICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIHRpdGxlID0gIiIsCiAgICAgICBzaXplID0gIk51bWJlciIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfbm9ydGhlYXN0KSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX25vcnRoZWFzdCwKICAgIGNvbG9yID0gIndoaXRlIiwKICAgIGZpbGwgPSAibGlnaHRncmV5IiwKICAgIGFscGhhID0gMC41CiAgKSArCiAgZ2VvbV9wb2ludChhZXMoCiAgICB4ID0gaml0dGVyKGxvbiksCiAgICB5ID0gaml0dGVyKGxhdCksCiAgICBjb2xvciA9IG1heF9qb2IsCiAgICBzaXplID0gbWF4CiAgKSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKAogICAgICAiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsCiAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIKICAgICksCiAgICBuYW1lID0gIkpvYiBUaXRsZSIKICApICsKICB0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICkgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgdGl0bGUgPSAiIiwKICAgICAgIHNpemUgPSAiTnVtYmVyIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c19taWR3ZXN0KSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX21pZHdlc3QsCiAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICBmaWxsID0gImxpZ2h0Z3JleSIsCiAgICBhbHBoYSA9IDAuNQogICkgKwogIGdlb21fcG9pbnQoYWVzKAogICAgeCA9IGppdHRlcihsb24sIDEwMCksCiAgICB5ID0gaml0dGVyKGxhdCwgMTAwKSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QocG9pbnRzX3RuKSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX3RuLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZmlsbCA9ICJsaWdodGdyZXkiLAogICAgYWxwaGEgPSAwLjUKICApICsKICBnZW9tX3BvaW50KGFlcygKICAgIHggPSBqaXR0ZXIobG9uKSwKICAgIHkgPSBqaXR0ZXIobGF0KSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QocG9pbnRzX2ZsKSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX2ZsLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZmlsbCA9ICJsaWdodGdyZXkiLAogICAgYWxwaGEgPSAwLjUKICApICsKICBnZW9tX3BvaW50KGFlcygKICAgIHggPSBqaXR0ZXIobG9uKSwKICAgIHkgPSBqaXR0ZXIobGF0KSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QocG9pbnRzX3dhKSArCiAgZ2VvbV9zZigKICAgIGRhdGEgPSBzdGF0ZV9tYXBzX3dhLAogICAgY29sb3IgPSAid2hpdGUiLAogICAgZmlsbCA9ICJsaWdodGdyZXkiLAogICAgYWxwaGEgPSAwLjUKICApICsKICBnZW9tX3BvaW50KGFlcygKICAgIHggPSBqaXR0ZXIobG9uKSwKICAgIHkgPSBqaXR0ZXIobGF0KSwKICAgIGNvbG9yID0gbWF4X2pvYiwKICAgIHNpemUgPSBtYXgKICApLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoCiAgICAgICJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwKICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IgogICAgKSwKICAgIG5hbWUgPSAiSm9iIFRpdGxlIgogICkgKwogIHRoZW1lKAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICB0aXRsZSA9ICIiLAogICAgICAgc2l6ZSA9ICJOdW1iZXIiKQpgYGAKCmBgYHtyfQpEQVRBICU+JQogIGZpbHRlcih3b3Jrc2l0ZV9zdGF0ZV9hYmIgPT0gIlROIikgJT4lCiAgZ3JvdXBfYnkoeWVhciwgZGF0YV9yZWxhdGlvbikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIAogIGdncGxvdChhZXMoCiAgICB4ID0geWVhciwKICAgIHkgPSBuLAogICAgZmlsbCA9IGFzLmZhY3RvcihkYXRhX3JlbGF0aW9uKQogICkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwKICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsCiAgICAgICAgICAgYWxwaGEgPSAwLjgpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLAogICAgbmFtZSA9ICIiLAogICAgbGFiZWxzID0gYygiRGF0YSBqb2JzIiwgIk90aGVycyIpCiAgKSArCiAgbGFicyh5ID0gIlxuIE51bWJlciIsIHggPSAiXG4gWWVhciIpICsKICAjc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpe3Bhc3RlMCh4LzEwMDAsICdLJyl9KSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpgYGA=